package tech.aistar.day14;

import java.lang.reflect.Array;

/**
 * 本类用来演示: 反射操作数组
 *
 * @author: success
 * @date: 2021/3/25 1:44 下午
 */
public class ArrayDemo {
    public static void main(String[] args) {
//        int[] arr = {1,2,3};
        Point p1 = new Point(10,"admin");
        Point p2 = new Point(10,"admin");
        Point p3 = new Point(10,"admin");

        Point[] arr = {p1,p2,p3};

        Object arrs = extendsArr(arr);

        printArr(arrs);
    }
    //反射的方式来遍历数组
    public static void printArr(Object arr){
        int len = Array.getLength(arr);
        for (int i = 0; i < len; i++) {
            Object o = Array.get(arr,i);
            System.out.println(o);
        }
    }

    /**
     * 反射进行数组的扩容...
     * @param arr
     */
    public static Object extendsArr(Object arr){
        //1. 创建数组 - 元素类型,新数组长度.
        //2. 反射获取数组的元素类型 - 组件类型

        //3. 获取新数组的长度 - 原来数组长度的两倍
        int lens = Array.getLength(arr);
        int len = lens*2;
        Class<?> type = arr.getClass().getComponentType();

        //4.反射创建新的数组
        Object newArr = Array.newInstance(type,len);

        //5. 遍历原来的数组,将原来数组中的数据放入到newArr中
        for (int i = 0; i < lens; i++) {
            //根据下标获取数组中的值
            Object o = Array.get(arr,i);
            //将o复制到newArr
            //反射技术来设置数组中的值
            Array.set(newArr,i,o);
        }
        return newArr;
    }
}
